package com.gp.base;

import java.io.Serializable;
import java.util.List;
import java.util.UUID;

import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

import com.gp.base.except.BusinessException;
import com.gp.base.util.ECPage;
import com.gp.base.util.GenericsUtils;
import com.gp.base.util.StrUtil;

/**
 * 
 * <li>类型名称：
 * <li>说明：普通服务类的基类，该基类提供了增删改查业务方法的基本实现；本类主要调用daoUtils对象进行数据库操作
 * <li>要继承基类必须提供T，S两个范型参数，T指明manger操作的实体类，S指明了manager查询时使用的SearchBean类型
 * <li>创建人： 曾明辉
 * <li>创建日期：2011-03-04
 * <li>修改人： 
 * <li>修改日期：
 */
public abstract class BaseManager<T> {
	static protected String DEFAULT_IS_USE = "isUse";	// 默认启用弃用属性名
	static protected String DEFAULT_IS_USE_START_UP = "1";	// 启用选项值
	static protected String DEFAULT_IS_USE_GIVE_UP = "0";	// 弃用选项值
	
	protected BaseDao baseDao;	 // 数据库操作工具
	protected Class<T> entityClass;          // DAO所管理的Entity类型.
	
		
	public BaseDao getBaseDao() {
		return baseDao;
	}

	public void setBaseDao(BaseDao baseDao) {
		this.baseDao = baseDao;
	}

	/**
	 * 
	 * <li>说明：根据子类定义时传入的实体类参数设置entityClass
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	@SuppressWarnings("unchecked")
	public BaseManager() {
		entityClass = GenericsUtils.getSuperClassGenricType(getClass());
	}
	
	

	/**
	 * 
	 * <li>方法名：get
	 * <li>@param id
	 * <li>@return
	 * <li>@throws BusinessException
	 * <li>返回类型：T
	 * <li>说明：用得到对象
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public T get(Serializable id)throws BusinessException{
		return (T)baseDao.get(id,entityClass);
	}

	
	/**
	 * 
	 * <li>方法名：insert
	 * <li>@param entity 范型指定类型的实体。
	 * <li>@return 返回范型制定类型的实体对象。
	 * <li>@throws BusinessException
	 * <li>返回类型：T
	 * <li>说明：新增实体。
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public  T insert(T entity) throws BusinessException {
		checkUnique(entity);
		
		this.baseDao.insert(entity);
		
		return entity;
	}
	
	/**
	 * 
	 * <li>方法名：update
	 * <li>@param entity 范型指定类型的实体。
	 * <li>@return 返回范型制定类型的实体对象。
	 * <li>@throws BusinessException
	 * <li>返回类型：T
	 * <li>说明：更新实体。
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public  T update(T entity) throws BusinessException {
		checkUnique(entity);
		this.baseDao.update(entity);
		
		return entity;
	}
	

	/**
	 * 
	 * <li>方法名：deleteByIds
	 * <li>@param ids 根据制定的实体身份标示数组进行批量删除实体对象。
	 * <li>返回类型：void
	 * <li>说明：根据制定的实体身份标示数组进行批量删除实体；如果删除业务实体前需要做一些特殊的业务判断或事情；
	 * <li>请在子类中覆盖checkDelete方法。
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public void deleteByIds(Serializable... ids) throws BusinessException{
		for (Serializable id : ids) {
			checkDelete(id);
		}
		this.baseDao.delete(entityClass,ids);//按对象删除
	}

	
	/**
	 * 
	 * <li>方法名：findPage
	 * <li>@param entitySearch
	 * <li>@param page
	 * <li>@param needSearchCount
	 * <li>@return
	 * <li>@throws BusinessException
	 * <li>返回类型：List<T>
	 * <li>说明：用分页查询
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public List<T> findPage(T entitySearch, ECPage page, boolean needSearchCount)throws BusinessException{
		if(needSearchCount == true){
			page.setTotalRows(this.baseDao.getCount(entitySearch));
		}
				
		return this.baseDao.findPage(entitySearch, page);
	}
	
	/**
	 * 
	 * <li>方法名：getCount
	 * <li>@param entitySearch
	 * <li>@return
	 * <li>@throws BusinessException
	 * <li>返回类型：Integer
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2010-10-11
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public Integer getCount(T entitySearch)throws BusinessException{				
		return this.baseDao.getCount(entitySearch);
	}
	/**
	 * 
	 * <li>方法名：find
	 * <li>@param entitySearch
	 * <li>@return
	 * <li>@throws BusinessException
	 * <li>返回类型：List<T>
	 * <li>说明：用不分页查询
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public List<T> find(T entitySearch)throws BusinessException{				
		return this.baseDao.find(entitySearch);
	}
	
	
	
	
	/**
	 * 
	 * <li>方法名：checkUnique
	 * <li>@param entity 范型指定类型的实体对象。
	 * <li>@throws BusinessException
	 * <li>返回类型：void
	 * <li>说明：检查某个字段或某些字段是否有重复的情况；在保存，修改之前调用；强制程序员实现。
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	abstract protected void checkUnique(T entity) throws BusinessException;
	
	/**
	 * 
	 * <li>方法名：checkDelete
	 * <li>@param id 范型指定类型的实体对象的ID。
	 * <li>@throws BusinessException
	 * <li>返回类型：void
	 * <li>说明：在删除时需要做的删除验证
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	abstract protected void checkDelete(Serializable id) throws BusinessException;

	
	
	
	
}
